package com.sokobanboxpro.game.gameplay;

import com.sokobanboxpro.game.Application;
import com.sokobanboxpro.game.entity.ImageObj;
import com.sokobanboxpro.game.entity.Text;
import com.sokobanboxpro.game.managers.ActionGameManager;
import com.sokobanboxpro.game.managers.LevelManager;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.SlickException;

/**
 * Интерфейс игры. Все кнопки управления, меню и т.д.
 *
 * @author Esr
 */
public class Interface {
		/*
		 * Массив всех изображений.
		 */

		private ImageObj[] imageObjs;
		/**
		 * Массив всех текстов.
		 */
		private Text[] texts;
		/**
		 * Игра, к которой принадлежит интерфейс.
		 */
		private Game game;
		/**
		 * Показывались стрелки-подсказки.
		 */
		private boolean arrowsShow = false;
		/**
		 * Время, оставшееся до конца показа стрелок.
		 */
		private int arrowShowLeft = 1000;

		/**
		 * Создание интерфейса.
		 *
		 * @param game Игра, к которой принадлежит интерфейс
		 * @throws SlickException Если не смогли загрузить какое либо из изображений
		 */
		public void init(Game game) throws SlickException {

				this.game = game;

				texts = new Text[0];

				imageObjs = new ImageObj[10];
				imageObjs[0] = new ImageObj("resource/images/arrows.png", 700, 140);
				imageObjs[1] = new ImageObj("resource/images/back.png", 700, 80);
				imageObjs[2] = new ImageObj("resource/images/arrow-left.png", 700, 340);
				imageObjs[3] = new ImageObj("resource/images/arrow-right.png", 750, 340);
				imageObjs[4] = new ImageObj("resource/images/reset.png", 750, 440);
				imageObjs[5] = new ImageObj("resource/images/back2menu.png", 750, 10);
				imageObjs[6] = new ImageObj("resource/images/bigUP.png", 300, 0);
				imageObjs[7] = new ImageObj("resource/images/bigDOWN.png", 300, 380);
				imageObjs[8] = new ImageObj("resource/images/bigLEFT.png", 0, 200);
				imageObjs[9] = new ImageObj("resource/images/bigRIGHT.png", 600, 200);



		}

		/**
		 * Проверка поподания точки в облость.
		 *
		 * @param x Координата x точки
		 * @param y Координата y точки
		 * @param lx Левая координата x облости
		 * @param ty Вырхняя координата y облости
		 * @param rx Правая координата x облости
		 * @param by Нижняя координата y облости
		 * @return Попала ли
		 */
		protected boolean checkPoint(int x, int y, int lx, int ty, int rx, int by) {

				return x > lx && x < rx && y > ty && y < by;

		}

		/**
		 * Попали ли координаты в изображение.
		 *
		 * @param x Координата x
		 * @param y Координата y
		 * @param image Изображение для проверки
		 * @return Попали ли координаты в изображение
		 */
		private boolean checkPointInImage(int x, int y, ImageObj image) {

				return checkPoint(x, y, (int) image.getX(), (int) image.getY(),
								(int) image.getX() + image.getImage().getWidth(),
								(int) image.getY() + image.getImage().getHeight());

		}

		/**
		 * Обновление интерфейса.
		 *
		 * @param gc
		 * @param delta Время прошедшее с предыдушего обновления
		 */
		public void update(GameContainer gc, int delta) {
				if (!arrowsShow) {
						arrowShowLeft -= delta;
						if (arrowShowLeft < 0) {
								imageObjs[6].setX(1500);
								imageObjs[7].setX(1500);
								imageObjs[8].setX(1500);
								imageObjs[9].setX(1500);
						}
				}

		}

		/**
		 * Нажатие мыши или касание экрана.
		 *
		 * @param x Координата x
		 * @param y Координата y
		 */
		public void mousePressed(int x, int y) throws Exception {


				if (checkPointInImage(x, y, imageObjs[2])) {
						game.changeLevelDown();

				} else if (checkPointInImage(x, y, imageObjs[3])) {
						game.changeLevelUp();
				} else if (checkPointInImage(x, y, imageObjs[1])) {
						game.getGameplay().cancelMove();
				} else if (checkPointInImage(x, y, imageObjs[4])) {
						game.resetLevel();
				} else if (checkPointInImage(x, y, imageObjs[5])) {
						Application.setStateMenu();
				} else if (checkPoint(x, y, 700 + 40, 140, 700 + 60, 140 + 40) || checkPoint(x, y, 250, 0, 450, 200)) {
						game.getGameplay().movePlayerUp();

				} else if (checkPoint(x, y, 700, 140 + 40, 700 + 40, 140 + 60) || checkPoint(x, y, 0, 150, 250, 350)) {
						game.getGameplay().movePlayerLeft();

				} else if (checkPoint(x, y, 700 + 40, 140 + 60, 700 + 60, 140 + 100) || checkPoint(x, y, 250, 260, 480, 480)) {
						game.getGameplay().movePlayerDown();

				} else if (checkPoint(x, y, 700 + 60, 140 + 40, 700 + 100, 140 + 60) || checkPoint(x, y, 480, 200, 700, 350)) {
						game.getGameplay().movePlayerRight();

				}


		}

		/**
		 * Перемешение мыши или пальца.
		 *
		 * @param oldx Начальная координата x
		 * @param oldy Начальная координата y
		 * @param newx Новая координата x
		 * @param newy Новая координата y
		 */
		public void mouseDragged(int oldx, int oldy, int newx, int newy) {
		}

		/**
		 * Получить изображения.
		 *
		 * @return Массив изображений
		 */
		public ImageObj[] getImageObjs() {
				return imageObjs;
		}

		/**
		 * Получить массив текстов.
		 *
		 * @return Массив текстов
		 */
		public Text[] getTexts() {
				return texts;
		}

		/**
		 * Метод вызываемы при смене уровня.
		 */
		public void levelChanged() {

				Game game = ActionGameManager.game;
				if (game.getCurrentLevelNumber() != 0) {
						imageObjs[2].setY(340);
				} else {
						imageObjs[2].setY(-100);
				}

				if (game.getCurrentLevelNumber() == game.getLevelsComplite() - 1 || game.getCurrentLevelNumber() == LevelManager.levelAmount() - 1) {
						imageObjs[3].setY(-100);
				} else {
						imageObjs[3].setY(340);
				}

		}

}
